/**
 * @description 创建模板命令
 */
const fs = require('fs-extra')
const path = require('path')
const ora = require('ora')
const inquirer = require('inquirer')
const download = require('download-git-repo')
const chalk = require('chalk')
const ejs = require('ejs')
const { templateList } = require('../../data/template')
const diyQuestion = require('../../data/diyQuestion') // 用户输入的数据

const question = [
    {
        name: 'features',
        type: 'list',
        message: '请选择要创建的模板?',
        choices: templateList
    },
    ...diyQuestion // 用户输入的数据
]
const duplicateName = [
    {
        name: 'duplicateName',
        message: '当前目录已存在，请选择!',
        type: 'list',
        choices: [
            {
                name: '覆盖',
                value: 'overWrite'
            },
            {
                name: '重命名',
                value: 'rename'
            }
        ]
    },
    {
        name: 'newName',
        when: answers => answers.duplicateName === 'rename',
        type: 'input',
        message: '目录名称为：'
    }
]

// 判断是否有同名文件夹
const isHas = projectName => {
    const targetDir = path.join(process.cwd(), projectName)
    return fs.existsSync(targetDir)
}


const letDownload = projectName => {



    // 初始化loading图标文字
    inquirer.prompt(question).then(res => {
        let answers = Object.assign({}, res)
        const spinner = ora('模板下载中...')
        spinner.start()
        let info = question[0].choices.find(item => item.value === res.features)
        const targetDir = path.join(process.cwd(), projectName)
        download(`direct:${info.link}`, `./${projectName}`, {clone: true}, err => {
            if (err) {
                spinner.fail()
                console.log(chalk.red(err))
                console.log(chalk.red('获取模板失败'))
            } else {
                spinner.succeed()
                console.log(chalk.green('Success!'))
                // TODO 获取用的用户问题答案，并以用户create名称为项目名称
                // 获取所有的用户问题答案，并以用户create名称为项目名称
                // let obj = {name: projectName, ...answers}
                // // 处理package.json对应交互变更
                // fs.readFile(path.join(`./${projectName}` , 'package.json'), 'utf-8', (err, data) => {
                //     // 将buffer转成string，ejs.render()第一个参数接受string类型
                //     let str = res.toString()
                //     // 编译并输入结果
                //     let html = ejs.render(str, obj)
                //     // 重新写入对应文件
                //     fs.writeFile(path.join(`./${projectName}` , 'package.json'), html)
                // })
                // // 处理入口文件相关变更main.js
                // fs.readFile(path.join(`./${projectName}` , '/src/main.js'), 'utf-8', (err, data) => {
                //     let str = res.toString()
                //     let html = ejs.render(str, obj)
                //     fs.writeFile(path.join(`./${projectName}` , '/src/main.js'), html)
                // })

            }
            spinner.stop()
        })
    })
}
module.exports = name => {
    if (isHas(name)) {
        inquirer.prompt(duplicateName).then(res => {
            if (res.duplicateName === 'overWrite') { // 用户选择重写
                // 获取用户要操作的目录地址
                const targetDir = path.join(process.cwd(), name)
                // 创建loading文字提示及目录地址
                const loadingMsg = ora(`正在删除 ${chalk.cyan(targetDir)}...`)
                loadingMsg.start()
                // 删除目录及其所包含的文件
                fs.remove(targetDir).then(val => {
                    loadingMsg.succeed()
                    loadingMsg.stop()
                    // 这里执行下载模板的方法
                    letDownload(name)
                })
            } else {
                // 如果用户选择重命名，则在经理一次判断是否重命名
                letDownload(res.newName)
            }
        })
    } else {
        // 如果没有重名，则直接选择模板下载步骤
        letDownload(name)
    }
}
